package com.zb.mobile.network.service;

import com.zb.entity.AccounLoginInfo;
import com.zb.entity.RemarkVo;
import com.zb.entity.ZjWorkOrder;
import com.zb.exception.SMSException;
import com.zb.mobile.*;
import com.zb.result.PageUtil;
import com.zb.vo.OrderReservationTimeVo;
import com.zb.vo.OrderStatementTemplateVo;
import com.zb.vo.WorkCallPhoneLogVo;
import com.zb.vo.WorkSpareVo;

import java.util.List;
import java.util.Map;

/**
 * @Author WEN
 * @Date 2023/11/22 0022
 **/
public interface ConNetworkOrderMobileService {
    /**
     * 获取服务商移动端待办数量
     * @param loginInfo
     * @return
     */
    NetworkEmpMobileToDoQtyVo getToDoQty(AccounLoginInfo loginInfo);

    /**
     * 获取侧边栏数据
     * @param loginInfo
     * @return
     */
    Object getSidebarData(AccounLoginInfo loginInfo);

    /**
     * 获取工单合计
     * @param loginInfo
     * @param selectVo
     * @return
     */
    Map<String, Object> getNetworkOrderStat(AccounLoginInfo loginInfo, NetworkOrderStatSelectVo selectVo);

    /**
     * 获取服务商近七天的工单数
     * @param loginInfo
     * @return
     */
    Object getNetworkInSevenDaysOrder(AccounLoginInfo loginInfo);

    /**
     * 获取排行榜数据
     * @param loginInfo 登录账号信息
     * @param selectVo 搜索条件
     * @return
     */
    Map<String, Object> getNetworkOrderScoreStat(AccounLoginInfo loginInfo, NetworkOrderStatSelectVo selectVo);

    /**
     * 获取工单报表(工单类型占比)
     * @param loginInfo 登录信息
     * @param selectVo 搜索条件对象
     * @return
     */
    Map<String, Object> getNetworkOrderModuleStat(AccounLoginInfo loginInfo, NetworkOrderStatSelectVo selectVo);

    /**
     * 获取工单报表(工单分析)
     * @param loginInfo
     * @return
     */
    Map<String, Object> getWeekOrderStat(AccounLoginInfo loginInfo);


    /**
     * 获取服务商消息列表
     * @param loginInfo 登录账号信息
     * @param selectVo 搜索条件
     * @return
     */
    Map<String, Object> getNetworkOrderMessageList(AccounLoginInfo loginInfo, NetworkMobileOrderMessageListSelectVo selectVo);

    /**
     * 更新未读留言
     * @param loginInfo
     */
    void updateNetworkOrderNotReadMessage(AccounLoginInfo loginInfo, Long workId);

    /**
     * 根据工单ID获取留言列表
     * @param loginInfo 登录信息
     * @param workId 工单ID
     * @param pageUtil 分页信息
     * @return
     */
    Map<String, Object> getNetworkOrderMessage(AccounLoginInfo loginInfo, Long workId, PageUtil pageUtil);

    /**
     * 获取服务商工单列表状态数量
     * @param loginInfo 账号信息
     * @param keyword 搜索关键词：工单单号/一物一码/产品名称/产品型号
     * @return
     */
    NetworkOrderStatusQtyVo getNetworkOrderListStatusQty(AccounLoginInfo loginInfo, String keyword);

    /**
     * 获取服务商工单列表
     * @param loginInfo 登录账号信息
     * @param selectVo 搜索条件
     * @return
     */
    Map<String, Object> getNetworkOrderList(AccounLoginInfo loginInfo, NetworkMobileOrderListSelectVo selectVo);

    /**
     * 服务商确认接单
     * @param loginInfo 登录信息
     * @param workId 工单ID
     */
    void networkSureReceiveOrder(AccounLoginInfo loginInfo, Long workId, Integer expressCompany, String expressNbr);

    /**
     * 服务商拒绝接单
     * @param loginInfo 登录信息
     * @param workId 工单ID
     * @param remarkVo 备注说明
     */
    void networkRefuseReceiveOrder(AccounLoginInfo loginInfo, Long workId, RemarkVo remarkVo);

    /**
     * 服务商派工
     * @param loginInfo 登录信息
     * @param workId 工单ID
     * @param dispatchEngineerVo 派工信息
     */
    void networkDispatchEngineer(AccounLoginInfo loginInfo, Long workId, NetworkMobileDispatchEngineerVo dispatchEngineerVo);

    /**
     * 服务商申请取消工单
     * @param loginInfo 登录信息
     * @param workId 工单ID
     * @param remark 备注
     */
    void networkApplyCancelOrder(AccounLoginInfo loginInfo, Long workId, String remark);

    /**
     * 获取结单模板及字段
     * @param loginInfo 账号信息
     * @param workId 工单ID
     * @return
     */
    List<OrderStatementTemplateVo> getFinishOrderTemplateField(AccounLoginInfo loginInfo, Long workId);

    /**
     * 根据工单ID获取服务商信息
     * @param workId 工单ID
     * @return
     */
    NetworkMobileApplyStatementOrderInfoVo getNetworkStatement(Long workId);

    /**
     * 根据工单ID获取结单核销码
     * @param loginInfo
     * @param workId 工单ID
     */
    void getStatementWriteOffCode(AccounLoginInfo loginInfo, Long workId) throws SMSException;

    /**
     * 服务工程师申请结单
     * @param loginInfo 账号信息
     * @param workId 工单ID
     * @param statementVo 结单对象
     */
    void networkApplyFinishOrder(AccounLoginInfo loginInfo, Long workId, NetworkMobileStatementVo statementVo) throws SMSException;

    /**
     * 工单详情-根据工单ID获取工单信息
     *
     * @param loginInfo 登录账号信息
     * @param workId    工单ID
     * @return
     */
    NetworkOrderDetailVo getNeworkOrderDetail(AccounLoginInfo loginInfo, Long workId);

    /**
     * 工单详情-根据工单ID获取工单详情内容
     * @param loginInfo 登录账号信息
     * @param workId 工单ID
     * @return
     */
    NetworkOrderDetailContentVo getNetworkOrderDetailContent(AccounLoginInfo loginInfo, Long workId);

    /**
     * 工单详情-商品
     * @param workId 工单ID
     * @return
     */
    List<UserOrderGoodsVo> getNetworkOrderDetailGoods(Long workId);

    /**
     * 工单详情-商品-商品编码
     * @param workGoodsId 工单商品ID
     * @return
     */
    List<String> getNetworkOrderDetailGoodsCode(Long workGoodsId);

    /**
     * 获取预约时间范围
     * @param workId 工单ID
     * @return
     */
    Object getNetworkReservationTimeRange(Long workId);

    /**
     * 触发拨打电话的保存
     * @param loginInfo
     * @param workId 工单ID
     */
    void saveTriggerCallPhone(AccounLoginInfo loginInfo, Long workId);

    /**
     * 保存拨打电话记录
     * @param loginInfo
     * @param workId 工单ID
     * @param callPhoneLogVo
     */
    void saveCallPhoneLog(AccounLoginInfo loginInfo, Long workId, WorkCallPhoneLogVo callPhoneLogVo);

    /**
     * 预约时间
     * @param loginInfo
     * @param orderReservationTimeVo
     */
    void networkReservationTime(AccounLoginInfo loginInfo, OrderReservationTimeVo orderReservationTimeVo);

    /**
     * 工程师申请转单/转派工程师
     * @param loginInfo 登录账号信息
     * @param workId 工单ID
     * @param remark 转单原因备注
     */
    void networkApplyTransferEngineer(AccounLoginInfo loginInfo, Long workId, String remark);

    /**
     * 服务商审核工程师转单申请
     * @param loginInfo 登录账号信息
     * @param transferEngineerVo 转单审核对象
     */
    void networkCheckTransferEngineer(AccounLoginInfo loginInfo, NetworkMobileCheckTransferEngineerVo transferEngineerVo);

    /**
     * 申请改派服务商
     * @param loginInfo 登录账号信息
     * @param workId 工单ID
     * @param remark 改派原因备注
     */
    void networkApplyChangeNetwork(AccounLoginInfo loginInfo, Long workId, String remark);

    /**
     * 取消改派服务商申请
     * @param loginInfo 登录账号信息
     * @param workId 工单ID
     * @param remark 取消改派原因备注
     */
    void networkCancelChangeNetworkApply(AccounLoginInfo loginInfo, Long workId, String remark);

    /**
     * 工程师签到打卡
     * @param loginInfo
     * @param workId 工单ID
     * @param engineerSignVo
     */
    Object networkEngineerSign(AccounLoginInfo loginInfo, Long workId, NetworkMobileEngineerSignVo engineerSignVo);

    /**
     * 根据工单ID获取是否费用全包
     * @param workId 工单ID
     * @return
     */
    Boolean getOrderAllInclusiveFeeByWorkId(Long workId);

    /**
     * 保存申请费用
     * @param loginInfo
     * @param workId 工单ID
     * @param orderFeeVo
     */
    void saveApplyFee(AccounLoginInfo loginInfo, Long workId, NetworkMobileOrderFeeVo orderFeeVo);

    /**
     * 保存申请工单配件
     * @param loginInfo
     * @param workSpareVo
     */
    void saveApplySpare(AccounLoginInfo loginInfo, WorkSpareVo workSpareVo);

    /**
     * 获取费用信息
     * @param workId 工单ID
     * @return
     */
    Map<String, Object> getOrderFeeInfo(Long workId);

}
